package servlet;

import bean.RptPensionesMaternal;
import co.edu.pedagogica.recibo.ReciboBuilder;
import co.edu.pedagogica.recibo.ReciboDirector;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import ejb.RptPensionesMaternalFacade;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author Juan Sebastian Hernández Serrato
 */
@WebServlet(name = "GenerarRecibo", urlPatterns = {"/GenerarRecibo"})
public class GenerarReciboServlet extends HttpServlet {
    
    @EJB
    RptPensionesMaternalFacade facade;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, DocumentException {
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition","inline; filename=Escuela Maternal - Recibo de Pago");

        Document documento;
        
//        final ArrayList<RptPensionesMaternal> registros = new ArrayList<RptPensionesMaternal>();
//        registros.add(facade.findById(request.getParameter("documento")));
        
        try{
            final List<RptPensionesMaternal> registros = facade.findByDocEstudiante(request.getParameter("documento"));
            if(registros == null)
                throw new Exception("Error al generar el recibo, por favor intente más tarde.");
            if(registros.isEmpty())
               throw new Exception("No hay registros activos para este documento");
            ReciboDirector reciboDirector = new ReciboDirector();
            ReciboBuilder reciboBuilder = new ReciboBuilder() {
                @Override
                public void buildReferenciaDePago() {
                    recibo.setReferenciaDePago(registros.get(0).getRefPago());
                }

                @Override
                public void buildNumeroDeRecibo() {
                    recibo.setNumeroDeRecibo(registros.get(0).getNumRecibo());
                }

                @Override
                public void buildPrograma() {
                    recibo.setPrograma(registros.get(0).getPrograma());
                }

                @Override
                public void buildPeriodo() {
                    recibo.setPeriodo(registros.get(0).getMes());
                }

                @Override
                public void buildFechaDeExpedicion() {
                    recibo.setFechaDeExpedicion(Calendar.getInstance());
                }

                @Override
                public void buildFechaLimiteDePago() {
                    Calendar fechaLimite = Calendar.getInstance();
                    fechaLimite.setTime(registros.get(0).getFecLimite());
                    recibo.setFechaLimiteDePago(fechaLimite);
                }

                @Override
                public void buildFechaDeVencimiento() {
                    Calendar fechaVence = Calendar.getInstance();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                    try {
                        fechaVence.setTime(sdf.parse(registros.get(0).getFecVencimiento()));// all done
                    } catch (ParseException ex) {
                        fechaVence = null;
                    }
                    recibo.setFechaDeVencimiento(fechaVence);
                }

                @Override
                public void buildValorRecibo() {
                    recibo.setValorRecibo((registros.get(0).getValRecibo().longValue()));
                }

                @Override
                public void buildValorSaldo() {
                    recibo.setValorSaldo((registros.get(0).getSaldoAnterior().longValue()));
                }

                @Override
                public void buildValorTotal() {
                    Long valor = ((registros.get(0).getValTotal()).longValue());
                    recibo.setValorTotal(valor);
                }

                @Override
                public void buildCifra() {
                    recibo.setCifra(registros.get(0).getCifra());
                }

                @Override
                public void buildCentroDeCostos() {
                    recibo.setCentroDeCostos("Escuela Maternal - UPN");
                }

                @Override
                public void buildCabecera() {
                    recibo.setCabecera(
                          "ESCUELA MATERNAL - UPN"  + "\n"
                        + "Facultad de Educación"   + "\n"
                        + "Carrera 22 no 73 - 43"     + "\n"
                        + "Tel. 255 56 09"  + "\n"
                    );
                }

                @Override
                public void buildDocumento() {
                    recibo.setDocumento(registros.get(0).getDocEstudiante());
                }

                @Override
                public void buildNombre() {
                    recibo.setNombre(registros.get(0).getEstudiante());
                }

                @Override
                public void buildConceptos() {
                    Map<String, Long> conceptos = new HashMap<String, Long>();
                    for(RptPensionesMaternal r : registros){
                        conceptos.put(registros.get(0).getConcepto(), registros.get(0).getValConcepto().longValue());
                    }
                    recibo.setConceptos(conceptos);
                }

                @Override
                public void buildPie() {
                    recibo.setPie("PAGO UNICAMENTE EN EFECTIVO");
                }

                @Override
                public void buildLogo() {
                    try {
                        recibo.setLogo(Image.getInstance("logo.jpg"));
                    } catch (Exception ex) {
                        ex.printStackTrace();
                        recibo.setLogo(null);
                    }
                }
            };
            reciboDirector.setReciboBuilder(reciboBuilder);
            reciboDirector.constructRecibo();
            documento = reciboDirector.getRecibo().obtenerRecibo(response.getOutputStream());
        }
        catch(Exception de){
            documento = new Document();
            PdfWriter writer = PdfWriter.getInstance(documento, response.getOutputStream());
            documento.open();
            documento.add(new Paragraph(de.getMessage()));
            documento.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (DocumentException ex) {
            Logger.getLogger(GenerarReciboServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (DocumentException ex) {
            Logger.getLogger(GenerarReciboServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public String getServletInfo() {
        return "Genera recibos de pago de la escuela maternal";
    }
}
